home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
jovept1.arc
/
FUNCS.C
< prev
next >
Wrap
Text File
|
1985-05-30
|
21KB
|
852 lines
/* funcs.c */
/* JOVE/MSDOS. K. Mitchum 1/85 */
/* Modifications for personal use only. */
/* original code J. Payne LSRHS 5/83 */
/* Ken Mitchum */
/* University of Pittsburgh */
/* Decision Systems Laboratory */
/*
Jonathan Payne at Lincoln-Sudbury Regional High School 4-19-83
jove_funcs.c
This is like the second half of jove_extend.c. It was divided
because the file was taking too long to compile ... */
#define FUNCS
#include "jove.h"
#include "funcs.h"
#include "files.h"
static int nfuncs = 0,
nmacros = 0,
nvars = 0;
tmany(str)
char *str;
{
complain("too many %s", str);
}
DefFunc(name, func)
char *name;
int (*func)();
{
if (nfuncs >= NFUNCS)
tmany("functions");
functions[nfuncs].f_name = name;
functions[nfuncs].f.Func = func;
functions[nfuncs].f_type = FUNCTION;
nfuncs++;
}
DefVar(name, varptr)
char *name;
int *varptr;
{
if (nvars >= NVARS)
tmany("variables");
variables[nvars].f_name = name;
variables[nvars].f.Var = varptr;
variables[nvars].f_type = VARIABLE;
nvars++;
}
DefMac(name, macptr)
char *name;
FMACRO *macptr;
{
if (nmacros > NVARS)
tmany("macros");
macros[nmacros].f_name = name;
macros[nmacros].f.Macro = macptr;
macros[nmacros].f_type = MACRO;
nmacros++;
}
extern int
EscPrefix(),
CtlxPrefix(),
AppReg(),
Apropos(),
BackChar(),
Bparen(),
BackWord(),
Bof(),
Bol(),
Bos(),
Bow(),
BindAKey(),
BindMac(),
BufPos(),
UnBound(),
CasRegLower(),
CasRegUpper(),
CapWord(),
LowWord(),
UppWord(),
ChrToOct(),
ClAndRedraw(),
CopyRegion(),
CTab(),
DelBlnkLines(),
DelNChar(),
DelNWord(),
OneWindow(),
DelPChar(),
DelPWord(),
DelReg(),
DelWtSpace(),
DelCurWindow(),
KeyDesc(),
DescCom(),
Eof(),
Eol(),
Eos(),
Eow(),
BufErase(),
PtToMark(),
Extend(),
ExecMacro(),
RunMacro(),
Leave(),
FindFile(),
VisitFile(),
WindFind(),
FindTag(),
ToIndent(),
ForChar(),
Fparen(),
ForWord(),
FourTime(),
GoLine(),
GrowWindow(),
IncFSearch(),
IncRSearch(),
InsFile(),
InitBindings(),
Justify(),
BufKill(),
KillEOL(),
BufList(),
NotModified(),
NameMac(),
Newline(),
OpenLine(),
LineAI(),
NextLine(),
NextPage(),
NextWindow(),
OverWrite(),
PopMark(),
PageNWind(),
DoParen(),
DoBrace(),
PauseJove(),
PrevLine(),
PrevPage(),
PrevWindow(),
QRepSearch(),
QuotChar(),
ReadFile(),
ReadMacs(),
RedrawDisplay(),
ReInitTTY(),
RepSearch(),
Beep(),
DownScroll(),
UpScroll(),
ForSearch(),
RevSearch(),
SelBuf(),
SelfInsert(),
SetVar(),
SetMark(),
#ifdef UNIX
ShToBuf(),
#endif
ShrWindow(),
Source(),
SplitWind(),
Remember(),
Forget(),
StrLength(),
PauseJove(),
TextInsert(),
TransChar(),
UnBound(),
VtKeys(),
SaveFile(),
WtModBuf(),
WriteFile(),
WriteMacs(),
WrtReg(),
Yank(),
YankPop(),
PrVar(),
SetQchars(),
WNumLines();
#ifdef UNIX
extern int
CParse(),
LintParse(),
SpellCom(),
NextError(),
MakeErrors(),
ShellCom(),
RegToShell();
#endif
InitFuncs()
{
DefFunc("Prefix-1", EscPrefix);
DefFunc("Prefix-2", CtlxPrefix);
DefFunc("append-region", AppReg);
DefFunc("apropos", Apropos);
DefFunc("backward-char", BackChar);
DefFunc("backward-paren", Bparen);
DefFunc("backward-word", BackWord);
DefFunc("beginning-of-file", Bof);
DefFunc("beginning-of-line", Bol);
DefFunc("beginning-of-sentence", Bos);
DefFunc("beginning-of-window", Bow);
DefFunc("bind-to-key", BindAKey);
DefFunc("bind-macro-to-key", BindMac);
DefFunc("buffer-position", BufPos);
DefFunc("case-region-lower", CasRegLower);
DefFunc("case-region-upper", CasRegUpper);
DefFunc("case-word-capitalize", CapWord);
DefFunc("case-word-lower", LowWord);
DefFunc("case-word-upper", UppWord);
DefFunc("char-to-octal-insert", ChrToOct);
DefFunc("clear-and-redraw", ClAndRedraw);
DefFunc("copy-region", CopyRegion);
DefFunc("c-tab", CTab);
DefFunc("delete-blank-lines-around-point", DelBlnkLines);
DefFunc("delete-next-char", DelNChar);
DefFunc("delete-next-word", DelNWord);
DefFunc("delete-other-windows", OneWindow);
DefFunc("delete-previous-char", DelPChar);
DefFunc("delete-previous-word", DelPWord);
DefFunc("delete-to-killbuffer", DelReg);
DefFunc("delete-white-space", DelWtSpace);
DefFunc("delete-current-window", DelCurWindow);
DefFunc("describe-key", KeyDesc);
DefFunc("describe-command", DescCom);
DefFunc("end-of-file", Eof);
DefFunc("end-of-line", Eol);
DefFunc("end-of-sentence", Eos);
DefFunc("end-of-window", Eow);
DefFunc("erase-buffer", BufErase);
DefFunc("exchange-point-and-mark", PtToMark);
DefFunc("execute-extended-command", Extend);
DefFunc("execute-keyboard-macro", ExecMacro);
DefFunc("execute-macro", RunMacro);
DefFunc("exit-jove", Leave);
DefFunc("find-file", FindFile);
DefFunc("find-file-in-other-window", WindFind);
DefFunc("find-tag", FindTag);
DefFunc("first-non-blank", ToIndent);
DefFunc("forward-char", ForChar);
DefFunc("forward-paren", Fparen);
DefFunc("forward-word", ForWord);
DefFunc("four-times", FourTime);
DefFunc("goto-line", GoLine);
DefFunc("grow-window", GrowWindow);
DefFunc("i-search-forward", IncFSearch);
DefFunc("i-search-reverse", IncRSearch);
DefFunc("insert-file", InsFile);
DefFunc("init-bindings", InitBindings);
DefFunc("justify-paragraph", Justify);
DefFunc("kill-buffer", BufKill);
DefFunc("kill-to-end-of-line", KillEOL);
DefFunc("list-buffers", BufList);
DefFunc("make-buffer-unmodified", NotModified);
DefFunc("name-keyboard-macro", NameMac);
DefFunc("newline", Newline);
DefFunc("newline-and-backup", OpenLine);
DefFunc("newline-and-indent", LineAI);
DefFunc("next-line", NextLine);
DefFunc("next-page", NextPage);
DefFunc("next-window", NextWindow);
DefFunc("number-lines-in-window", WNumLines);
DefFunc("replace-char", OverWrite);
DefFunc("page-next-window", PageNWind);
DefFunc("paren-flash", DoParen);
DefFunc("brace-magic", DoBrace);
DefFunc("pause-jove", PauseJove);
DefFunc("pop-mark", PopMark);
DefFunc("previous-line", PrevLine);
DefFunc("previous-page", PrevPage);
DefFunc("previous-window", PrevWindow);
DefFunc("print", PrVar);
DefFunc("query-replace-search", QRepSearch);
DefFunc("quote-char", QuotChar);
DefFunc("read-file", ReadFile);
DefFunc("read-macros-from-file", ReadMacs);
DefFunc("redraw-display", RedrawDisplay);
DefFunc("reinitialize-terminal", ReInitTTY);
DefFunc("replace-search", RepSearch);
DefFunc("ring-the-bell", Beep);
DefFunc("scroll-down", DownScroll);
DefFunc("scroll-up", UpScroll);
DefFunc("search-forward", ForSearch);
DefFunc("search-reverse", RevSearch);
DefFunc("select-buffer", SelBuf);
DefFunc("self-insert", SelfInsert);
DefFunc("set", SetVar);
DefFunc("set-mark", SetMark);
DefFunc("set-quote-characters", SetQchars);
#ifdef UNIX
DefFunc("shell-command-to-buffer", ShToBuf);
#endif
DefFunc("shrink-window", ShrWindow);
DefFunc("source", Source);
DefFunc("split-current-window", SplitWind);
DefFunc("start-remembering", Remember);
DefFunc("stop-remembering", Forget); /* Not bad */
DefFunc("string-length", StrLength);
DefFunc("suspend-jove", PauseJove);
DefFunc("text-insert", TextInsert);
DefFunc("transpose-chars", TransChar);
DefFunc("unbound", UnBound);
DefFunc("visit-file", VisitFile);
DefFunc("vt100-arrow-keys", VtKeys);
DefFunc("write-current-file", SaveFile);
DefFunc("write-macros-to-file", WriteMacs);
DefFunc("write-modified-files", WtModBuf);
DefFunc("write-named-file", WriteFile);
DefFunc("write-region", WrtReg);
DefFunc("yank", Yank);
DefFunc("yank-pop", YankPop);
DefFunc((char *) 0, (int (*)()) 0);
#ifdef UNIX
DefFunc("parse-C-errors", CParse);
DefFunc("parse-LINT-errors", LintParse);
DefFunc("spell-buffer", SpellCom);
DefFunc("next-error", NextError);
DefFunc("compile-it", MakeErrors);
DefFunc("shell-command", ShellCom);
DefFunc("filter-region", RegToShell);
#endif
DefVar("allow-^S-and-^Q", &OKXonXoff);
DefVar("auto-indent", &globflags[AUTOIND]);
DefVar("c-mode", &globflags[CMODE]);
DefVar("case-independent-search", &globflags[CASEIND]);
DefVar("files-should-end-with-newline", &EndWNewline);
DefVar("internal-tabstop", &tabstop);
DefVar("magic", &globflags[MAGIC]);
DefVar("make-all-at-once", &MakeAll);
DefVar("over-write", &globflags[OVERWRITE]);
DefVar("physical-tabstop", &phystab);
DefVar("right-margin", &RMargin);
DefVar("show-match", &globflags[MATCHING]);
DefVar("scroll-step", &ScrollStep);
DefVar("text-fill", &globflags[TEXTFILL]);
DefVar("use-temporary-buffers", &UseBuffers);
DefVar("visible-bell", &VisBell);
DefVar("write-files-on-make", &WtOnMk);
DefVar((char *) 0, (int *) 0);
};
FUNCT *
FindFunc(func)
register int (*func)();
{
register FUNCT *fp;
for (fp = functions; fp->f_name; fp++)
if (fp->f_type == FUNCTION && fp->f.Func == func)
return fp;
return 0;
}
BindFunc(map, letter, func)
FUNCT *map[];
int (*func)();
{
static FUNCT *fp = 0;
if (!fp || fp->f.Func != func)
fp = FindFunc(func);
map[letter] = fp;
}
ZeroMap(map)
FUNCT *map[];
{
int i;
for (i = 0; i < 0200; i++)
map[i] = 0;
}
BindInserts(func)
FUNC func;
{
register int i;
for (i = ' '; i < 0177; i++)
BindFunc(mainmap, i, func);
BindFunc(mainmap, CTL(I), func);
}
InitBindings()
{
BindInserts(SelfInsert);
/* Most just insert themselves */
BindFunc(mainmap, CTL(@), SetMark);
BindFunc(mainmap, CTL(A), Bol);
BindFunc(mainmap, CTL(B), BackChar);
BindFunc(mainmap, CTL(C), SetMark);
BindFunc(mainmap, CTL(D), DelNChar);
BindFunc(mainmap, CTL(E), Eol);
BindFunc(mainmap, CTL(F), ForChar);
BindFunc(mainmap, CTL(G), Beep);
BindFunc(mainmap, CTL(H), DelPChar);
BindFunc(mainmap, CTL(I), CTab);
BindFunc(mainmap, CTL(J), LineAI);
BindFunc(mainmap, CTL(K), KillEOL);
BindFunc(mainmap, CTL(L), RedrawDisplay);
BindFunc(mainmap, CTL(M), Newline);
BindFunc(mainmap, CTL(N), NextLine);
BindFunc(mainmap, CTL(O), OpenLine);
BindFunc(mainmap, CTL(P), PrevLine);
BindFunc(mainmap, CTL(Q), QuotChar);
BindFunc(mainmap, CTL(^), QuotChar);
BindFunc(mainmap, CTL(R), RevSearch);
BindFunc(mainmap, CTL(S), ForSearch);
BindFunc(mainmap, CTL(\\), ForSearch);
BindFunc(mainmap, CTL(T), TransChar);
/* BindFunc(mainmap, CTL(U), FourTime); */
BindFunc(mainmap, CTL(U), EscPrefix);
BindFunc(mainmap, CTL(V), NextPage);
BindFunc(mainmap, CTL(W), DelReg);
BindFunc(mainmap, CTL(X), CtlxPrefix);
BindFunc(mainmap, CTL(Y), Yank);
BindFunc(mainmap, CTL(Z), UpScroll);
BindFunc(mainmap, CTL([), EscPrefix);
BindFunc(mainmap, ')', DoParen);
BindFunc(mainmap, '}', DoParen);
BindFunc(mainmap, '{', DoBrace);
BindFunc(mainmap, '\177', DelPChar);
BindFunc(pref1map, CTL(B), Bparen);
BindFunc(pref1map, CTL(F), Fparen);
BindFunc(pref1map, CTL(L), ClAndRedraw);
BindFunc(pref1map, CTL(V), PageNWind);
BindFunc(pref1map, '>', Eof);
BindFunc(pref1map, '<', Bof);
BindFunc(pref1map, 'a', Bos);
BindFunc(pref1map, 'A', Bos);
BindFunc(pref1map, 'B', BackWord);
BindFunc(pref1map, 'b', BackWord);
BindFunc(pref1map, 'C', CapWord);
BindFunc(pref1map, 'c', CapWord);
BindFunc(pref1map, 'D', DelNWord);
BindFunc(pref1map, 'd', DelNWord);
BindFunc(pref1map, 'E', Eos);
BindFunc(pref1map, 'e', Eos);
BindFunc(pref1map, 'F', ForWord);
BindFunc(pref1map, 'f', ForWord);
BindFunc(pref1map, 'G', GoLine);
BindFunc(pref1map, 'g', GoLine);
BindFunc(pref1map, 'J', Justify);
BindFunc(pref1map, 'j', Justify);
BindFunc(pref1map, 'L', LowWord);
BindFunc(pref1map, 'l', LowWord);
BindFunc(pref1map, 'M', ToIndent);
BindFunc(pref1map, 'm', ToIndent);
BindFunc(pref1map, 'Q', QRepSearch);
BindFunc(pref1map, 'q', QRepSearch);
BindFunc(pref1map, 'R', RepSearch);
BindFunc(pref1map, 'r', RepSearch);
BindFunc(pref1map, 'V', PrevPage);
BindFunc(pref1map, 'v', PrevPage);
BindFunc(pref1map, 'U', UppWord);
BindFunc(pref1map, 'u', UppWord);
BindFunc(pref1map, 'W', CopyRegion);
BindFunc(pref1map, 'w', CopyRegion);
BindFunc(pref1map, 'X', Extend);
BindFunc(pref1map, 'x', Extend);
BindFunc(pref1map, 'Y', YankPop);
BindFunc(pref1map, 'y', YankPop);
BindFunc(pref1map, 'Z', DownScroll);
BindFunc(pref1map, 'z', DownScroll);
BindFunc(pref1map, '[', VtKeys); /* Vt100 arrows */
BindFunc(pref1map, '\177', DelPWord);
BindFunc(pref1map, '\\', DelWtSpace);
BindFunc(pref1map, '~', NotModified);
BindFunc(pref1map, '.', Eow);
BindFunc(pref1map, ',', Bow);
BindFunc(pref1map, '?', Apropos);
/* CTLX prefix */
ZeroMap(pref2map);
BindFunc(pref2map, CTL(B), BufList);
BindFunc(pref2map, CTL(C), Leave);
BindFunc(pref2map, CTL(D), KeyDesc);
BindFunc(pref2map, CTL(F), FindFile);
BindFunc(pref2map, CTL(I), InsFile);
BindFunc(pref2map, CTL(L), CasRegLower);
BindFunc(pref2map, CTL(M), WtModBuf);
BindFunc(pref2map, CTL(O), DelBlnkLines);
BindFunc(pref2map, CTL(R), ReadFile);
BindFunc(pref2map, CTL(S), SaveFile);
BindFunc(pref2map, CTL(U), CasRegUpper);
BindFunc(pref2map, CTL(V), VisitFile);
BindFunc(pref2map, CTL(W), WriteFile);
BindFunc(pref2map, CTL(X), PtToMark);
BindFunc(pref2map, CTL(Z), GrowWindow);
BindFunc(pref2map, CTL(\\), SaveFile);
BindFunc(pref2map, '1', OneWindow);
BindFunc(pref2map, '2', SplitWind);
BindFunc(pref2map, '4', WindFind);
BindFunc(pref2map, 'B', SelBuf);
BindFunc(pref2map, 'b', SelBuf);
BindFunc(pref2map, 'c', StrLength);
BindFunc(pref2map, 'C', StrLength);
BindFunc(pref2map, 'D', DelCurWindow);
BindFunc(pref2map, 'd', DelCurWindow);
BindFunc(pref2map, 'E', ExecMacro);
BindFunc(pref2map, 'e', ExecMacro);
BindFunc(pref2map, 'K', BufKill);
BindFunc(pref2map, 'k', BufKill);
BindFunc(pref2map, 'N', NextWindow);
BindFunc(pref2map, 'n', NextWindow);
BindFunc(pref2map, 'O', PrevWindow);
BindFunc(pref2map, 'o', PrevWindow);
BindFunc(pref2map, 'P', PrevWindow);
BindFunc(pref2map, 'p', PrevWindow);
BindFunc(pref2map, 'R', IncRSearch);
BindFunc(pref2map, 'r', IncRSearch);
BindFunc(pref2map, 'S', IncFSearch);
BindFunc(pref2map, 's', IncFSearch);
BindFunc(pref2map, 'T', FindTag);
BindFunc(pref2map, 't', FindTag);
BindFunc(pref2map, '^', GrowWindow);
BindFunc(pref2map, '(', Remember);
BindFunc(pref2map, ')', Forget);
#ifdef UNIX
BindFunc(pref2map, CTL(N), NextError);
BindFunc(pref2map, CTL(E), MakeErrors);
BindFunc(pref2map, '!', ShellCom);
#endif
}
char *
FuncName()
{
static char func[60];
return sprintf(func, ": %s ", LastFunc->f_name);
}
int Interactive; /* True when we invoke with the command handler? */
ExecFunc(fp, interactive)
FUNCT *fp;
{
int bindinteract = Interactive;
Interactive = interactive;
LastFunc = fp;
switch (fp->f_type) {
case MACRO:
DoMacro(fp->f.Macro);
break;
case FUNCTION:
if (fp->f.Func)
(*fp->f.Func)();
}
Interactive = bindinteract;
}
/* Can only define the keyboard macro. IT can be renamed to another
* macro. If the keyboard macro is renamed, we make a copy of it.
* The keyboard macro is ALWAYS the keyboard macro.
*
* We can't define or run the same macro recursively. Each macro has
* a bit saying whether or not it is currently being executed/defined.
*/
char *rem = "remember";
FixMacros()
{
register int i;
FMACRO *mp;
for (i = 0; macstack[i]; i++) {
mp = macstack[i];
macstack[i] = 0;
mp->Flags = mp->Offset = 0;
}
stackp = -1;
KeyMacro.Flags = KeyMacro.Offset = 0;
}
MacErr(name1, name2)
char *name1,
*name2;
{
KeyMacro.Flags = 0;
MacNolen(&KeyMacro);
complain("Can't %s recursively; no longer %sing", name1, name2);
}
Remember()
{
if (KeyMacro.Flags & DEFINE)
MacErr(rem, rem);
KeyMacro.Flags |= DEFINE;
MacNolen(&KeyMacro);
message("Remembering...");
}
/* Is `c' a prefix character */
PrefChar(c)
{
#ifdef UNIX
return (mainmap[c]->f.Func == EscPrefix ||
mainmap[c]->f.Func == CtlxPrefix);
#else
return (mainmap[c]->f.Func == eprefix ||
mainmap[c]->f.Func == cprefix);
#endif
}
Forget()
{
char *cp;
FMACRO *m = &KeyMacro;
if (m->Flags & DEFINE) {
message("Keyboard macro defined");
m->Flags &= ~DEFINE;
cp = &m->Body[m->MacLength - 2];
if (PrefChar(*cp))
m->MacLength -= 2;
#ifdef UNIX
else if (functions[*++cp].f.Func == Forget)
#else
else if (functions[*++cp].f.Func == frgt)
#endif
m->MacLength--;
}
}
ExecMacro()
{
DoMacro(&KeyMacro);
}
DoMacro(mac)
FMACRO *mac;
{
if (mac->Flags & DEFINE)
MacErr("define", rem);
if (mac->Flags & EXECUTE)
MacErr("execute", "execut");
if (++stackp >= NMACROS)
complain("The impossible with macros just happened");
macstack[stackp] = mac;
mac->Offset = 0;
mac->Ntimes = exp;
mac->Flags |= EXECUTE;
}
char *
copystr(str)
char *str;
{
char *val = emalloc(strlen(str) + 1);
strcpy(val, str);
return val;
}
FMACRO *
macexists(name)
char *name;
{
register int i;
for (i = 0; i < nmacros; i++)
if (strcmp(macros[i].f.Macro->Name, name) == 0)
return macros[i].f.Macro;
return 0;
}
NameMac()
{
char *name;
FMACRO *m;
if (KeyMacro.MacLength == 0)
complain("Define it first!");
if (KeyMacro.Flags & (DEFINE | EXECUTE))
complain("Can't name while defining/executing");
if ((m = macexists(name = ask((char *) 0, FuncName()))) == 0)
m = (FMACRO *) emalloc(sizeof *m);
else {
if (strcmp(name, KeyMacro.Name) == 0)
complain("Can't name it that!");
free(m->Name);
free(m->Body);
}
name = copystr(name);
#ifdef UNIX
*m = KeyMacro; /* Copy the keyboard macro */
#else
m->MacLength = KeyMacro.MacLength;
m->MacBuflen = KeyMacro.MacBuflen;
#endif
m->Body = emalloc(m->MacBuflen);
copynchar(m->Body, KeyMacro.Body, m->MacLength);
m->Ntimes = m->Flags = m->Offset = 0; /* At the beginning */
m->Name = name;
DefMac(name, m);
}
copynchar(t, f, len)
register char *t,
*f;
register int len;
{
while (len--)
*t++ = *f++;
}
MacInit()
{
SetMacro(&KeyMacro, "keyboard-macro");
FixMacros();
}
MacNolen(m)
FMACRO *m;
{
m->MacLength = m->Offset = 0;
}
SetMacro(m, name)
FMACRO *m;
char *name;
{
DefMac(name, m); /* Try this before mallocing memory */
MacNolen(m);
m->Name = name;
m->MacBuflen = 16;
m->Body = emalloc(m->MacBuflen);
m->Ntimes = m->Flags = 0;
}
MacPutc(c)
int c;
{
if (KeyMacro.MacLength >= KeyMacro.MacBuflen) {
KeyMacro.Body = realloc(KeyMacro.Body, (unsigned) KeyMacro.MacLength + 16);
if (KeyMacro.Body == 0)
MacErr("malloc", rem);
KeyMacro.MacBuflen += 16;
}
KeyMacro.Body[KeyMacro.Offset++] = c;
KeyMacro.MacLength++;
}
MacGetc()
{
if (macstack[stackp]->Offset == macstack[stackp]->MacLength) {
macstack[stackp]->Offset = 0;
if (--macstack[stackp]->Ntimes == 0) {
macstack[stackp]->Flags &= ~EXECUTE;
stackp--;
}
return (*Gtchar)();
}
return macstack[stackp]->Body[macstack[stackp]->Offset++];
}
RunMacro()
{
int com;
com = findcom(macros, FuncName());
if (com < 0)
return;
DoMacro(macros[com].f.Macro);
}
WriteMacs()
{
FUNCT *mp;
FMACRO *m;
int macfd,
namelen;
char *file;
file = ask((char *) 0, FuncName());
if ((macfd = creat(file, CREATMODE)) == -1)
complain(IOerr("create", file));
/* Don't write the keyboard macro which is always the first */
for (mp = ¯os[1]; mp < ¯os[NMACROS]; mp++) {
m = mp->f.Macro;
if (m == 0 || m->MacLength == 0)
continue;
ignore(write(macfd, (char *) &m->MacLength, sizeof m->MacLength));
namelen = strlen(m->Name) + 1; /* Including the null */
ignore(write(macfd, (char *) &namelen, sizeof namelen));
ignore(write(macfd, m->Name, namelen));
ignore(write(macfd, m->Body, m->MacLength));
}
ignore(close(macfd));
}
ReadMacs()
{
char *file;
FMACRO *m;
int macfd,
namelen,
bodylen;
file = ask((char *) 0, FuncName());
if ((macfd = open(file, 0)) == -1)
complain(IOerr("open", file));
while (nmacros < NMACROS) {
if (read(macfd, (char *) &bodylen, sizeof m->MacLength) == 0)
break;
m = (FMACRO *) emalloc (sizeof *m);
m->MacLength = bodylen;
m->MacBuflen = (m->MacLength + 16) & ~017;
ignore(read(macfd, (char *) &namelen, sizeof namelen));
m->Name = emalloc(namelen);
ignore(read(macfd, m->Name, namelen));
m->Body = emalloc(m->MacBuflen);
ignore(read(macfd, m->Body, m->MacLength));
DefMac(m->Name, m);
}
ignore(close(macfd));
}
/*------------------------o.s. dependent------------------------*/
/* end */